package com.leetcode.algorithm.y22.m07;

import com.leetcode.algorithm.common.ListNode;

/**
 * 19. 删除链表的倒数第N个节点
 * 
 * https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
 * 
 * @author jie.deng
 *
 */
public class Question0019Solution01 {

    /**
     * 19. 删除链表的倒数第N个节点
     * 
     * 给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。
     * 
     * 示例：
     * 
     * 给定一个链表: 1->2->3->4->5, 和 n = 2.
     * 
     * 当删除了倒数第二个节点后，链表变为 1->2->3->5.
     * 说明：
     * 
     * 给定的 n 保证是有效的。
     * 
     * 进阶：
     * 
     * 你能尝试使用一趟扫描实现吗？
     * @param head
     * @param n
     * @return
     */
	public ListNode removeNthFromEnd(ListNode head, int n) {
		// 快慢指针：让快指针先走N步，接着快慢指针一起走，当快指针走到尾节点时慢指针即为待删除的节点。
		ListNode fast = head;
		ListNode slow = head;
		while (n > 0) {
			fast = fast.next;
			n--;
		}
		if (fast == null) {
			return head.next;
		}
		while (fast.next != null) {
			fast = fast.next;
			slow = slow.next;
		}
		slow.next = slow.next.next;
		return head;
	}    
	
}
